package com.kirayous.gulimall.product.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.io.Serializable;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.kirayous.common.valid.AddGroup;
import com.kirayous.common.valid.ListValue;
import com.kirayous.common.valid.UpdateGroup;
import com.kirayous.common.valid.UpdateStatusGroup;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

import javax.validation.constraints.*;

/**
 * 品牌
 * 
 * @author KiraYous
 * @email 404465398@qq.com
 * @date 2021-08-19 05:51:25
 */
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {




	private static final long serialVersionUID = 1L;

	/**
	 * 品牌id
	 */
	/*
	* groups的功能是只能改注解只有在指定这个分组的情况才能进行校验
	* 可以在@Validated注解里面指定分组
	* 注意有个坑点：不指定分组的字段，如果@Validated的时候指定了分组，那么默认没指定的分组是不起效的
	* 个人觉得如果项目大量使用注解+分组这些校验规则，会让项目很紧凑，逻辑容易造成混乱
	* 但是如果在数据库层进行校验，又会加重数据库的压力
	* 不知道实际开发是以这种方式为主还是别的，这看起来就很麻烦
	* */
	@NotNull(message = "修改必须指定品牌id",groups = {UpdateGroup.class})
	@Null(message = "新增不能指定id",groups = {AddGroup.class})
	@TableId(type= IdType.AUTO)
	//将ID序列化为String,为的是防止后台id主键达到了很大的值，
	// 然后返回数据给前端接收，而前端js对应数字有范围，容易发生溢出，
	// 容易造成前端获取到的id值与数据库的id值不一致
	//这里采用将返回来的BrandEntity的Long类型（Long类型可以被序列化，基本数据类型long无法被序列化，这就是包装类的好处）
	//序列化成String类型
	//这样可以避免因数字过大，前端js发生溢出
	@JsonSerialize(using = ToStringSerializer.class)
	private Long brandId;

	/**
	 * 品牌名
	 * @NotBlank,设置该字段不允许为null或者通过trim过滤后的长度要大于0
	 * 同样，@NotBlank是javax.validation.constraints包下面的
	 * 但是需要注意的是，这个相当于用作对VO对象进行校验
	 * 单纯在entity的属性设置注解是不起效的，还得配合@Validated在controller方法参数对传过来的vo对象进行校验才起作用
	 *
	 *
	 * VO：用来接收数据的，也就是作为controller方法的参数
	 * DTO：用来返回数据给前端，也就是controller 方法的Result返回值里面的date字段，一般会转换成json字符串格式
	 * 以上DTO和VO是我个人习惯的用法，我这样子用其实是错误的用法，正确的应该是反过来的
	 * 只是一直以来都搞反了，也不方便改了
	 * 而且反过来看起来也很顺眼
	 */
	@NotBlank(message = "品牌名不能为空")
	private String name;
	/**
	 * 品牌logo地址
	 * @URL 表明该字段需要符合URL规则，
	 * 这个是hibernate下的validator
	 * 但是用法其实差不多
	 */
	@URL
	private String logo;
	/**
	 * 介绍
	 */
	private String descript;
	/**
	 * 显示状态[0-不显示；1-显示]
	 */
//	@Pattern()
	/*
	 *
	 * @ListValue --->自定义校验注解
	 * */
	@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
	@ListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class})
	private Integer showStatus;
	/**
	 * 检索首字母
	 */
	@NotEmpty(groups={AddGroup.class})
	@Pattern(regexp="^[a-zA-Z]$",message = "检索首字母必须是一个字母",groups={AddGroup.class,UpdateGroup.class})
	private String firstLetter;
	/**
	 * 排序
	 */
	@NotNull(groups={AddGroup.class})
	@Min(value = 0,message = "排序必须大于等于0",groups={AddGroup.class,UpdateGroup.class})
	private Integer sort;

}
